// app.js - 应用入口文件
// 设置控制台编码为UTF-8以支持中文显示
const path = require('path');
const { setupConsoleEncoding, setConsoleCodePage } = require('./utils/encoding-utils');

// 初始化编码设置
setupConsoleEncoding();
setConsoleCodePage();

const { exec } = require('child_process');
const axios = require('axios');
const { app } = require('electron');
const fs = require('fs');

// 读取配置文件
let config;
try {
  const configPath = path.join(__dirname, 'config.json');
  const configData = fs.readFileSync(configPath, 'utf8');
  config = JSON.parse(configData);
} catch (error) {
  console.error('加载配置文件失败:', error.message);
  config = {
    ollama: {
      OLLAMA_BASE_URL: 'http://localhost:11434',
      api: {
        generate: '/api/generate',
        tags: '/api/tags'
      },
      model: 'qwen3:0.6b'
    }
  };
}

// 从配置中获取Ollama API基础URL和端点
const OLLAMA_BASE_URL = config.ollama.OLLAMA_BASE_URL;
const GENERATE_ENDPOINT = config.ollama.api.generate;
const TAGS_ENDPOINT = config.ollama.api.tags;

// 检查Ollama服务是否可用
async function checkOllamaService() {
  try {
    // 尝试连接Ollama服务
    await axios.get(`${OLLAMA_BASE_URL}${TAGS_ENDPOINT}`);
    console.log('Ollama服务已可用');
    return true;
  } catch (error) {
    console.error('Ollama服务不可用:', error.message);
    return false;
  }
}

// 尝试启动Ollama服务
function startOllamaService() {
  return new Promise((resolve) => {
    console.log('尝试启动Ollama服务...');
    
    // 根据操作系统选择启动命令
    let command;
    if (process.platform === 'win32') {
      command = 'start /B ollama serve';
    } else {
      command = 'ollama serve &';
    }
    
    exec(command, (error) => {
      if (error) {
        console.error('启动Ollama服务失败:', error.message);
        resolve(false);
      } else {
        console.log('已尝试启动Ollama服务');
        resolve(true);
      }
    });
  });
}

// 显示错误对话框
function showErrorDialog(message) {
  const { dialog } = require('electron');
  return dialog.showMessageBoxSync({
    type: 'error',
    title: 'Ollama 服务错误',
    message: 'Ollama 服务无法启动',
    detail: message + '\n\n请确保 Ollama 已正确安装并可通过命令行访问。',
    buttons: ['继续尝试', '退出应用']
  });
}

// 主函数 - 检查服务并启动主进程
async function main() {
  // let serviceAvailable = await checkOllamaService();
  // let retryCount = 0;
  // const maxRetries = 3;
  
  // // 尝试启动服务
  // while (!serviceAvailable && retryCount < maxRetries) {
  //   await startOllamaService();
    
  //   // 等待服务启动
  //   console.log(`等待Ollama服务启动... (尝试 ${retryCount + 1}/${maxRetries})`);
  //   await new Promise(resolve => setTimeout(resolve, 5000));
    
  //   serviceAvailable = await checkOllamaService();
  //   retryCount++;
  // }
  
  // // 如果还是不可用，显示错误对话框
  // if (!serviceAvailable) {
  //   const result = showErrorDialog(
  //     `尝试 ${maxRetries} 次后无法连接到 Ollama 服务。\n` +
  //     '可能原因:\n' +
  //     '1. Ollama 未安装\n' +
  //     '2. Ollama 服务未运行\n' +
  //     '3. 防火墙阻止了连接'
  //   );
    
  //   if (result === 1) {
  //     // 用户选择退出
  //     app.quit();
  //     return;
  //   }
  // }
  //   // 加载主进程
  // console.log('启动主应用...');
  // 将配置传递给主进程
  // process.env.NODE_ENV = 'production';
  process.env.INITIAL_CONFIG = JSON.stringify(config);
  require('./main.js');
}

// 当Electron应用准备好时启动主函数
app.whenReady().then(main);

// 处理所有窗口关闭事件
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});
